package org.ham007.proxysender.server.twitter.cmd;

import twitter4j.DirectMessage;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.User;

/**
 * 代理送信処理実行</br>
 * </br>
 * コマンド形式</br>
 * D ProxySender [cmd:send] [type:d|r] [to:宛先ユーザースクリーン名] msg:代理で送信するメッセージ</br>
 * ランダムユーザー宛に送信する機能を追加したい。</br>
 * @author 223
 *
 */
public class ProxySendProcesser implements CommandProcesser {

	/**
	 * コマンドとコマンドオプションを分離する</br>
	 * </br>
	 * @author 223
	 *
	 */
	public class CommandOptionSplitter
	{
		/**
		 * オプション値の取得</br>
		 * 指定オプション値が存在しない場合は、nullを返す。</br>
		 * @param src_cmd
		 * @param opt_name
		 * @return
		 */
		public String getOptionValue(String src_cmd, String opt_name)
		{
			if(src_cmd.startsWith(opt_name) == true)
				return src_cmd.split(" ")[0].split(":")[1]; 
			else
				return null;
		}
		
		/**
		 * 指定オプション除去後のコマンド文字列取得</br>
		 * </br>
		 * @param src_cmd
		 * @param opt_name
		 * @return
		 */
		public String getRemovedCommand(String src_cmd, String opt_name)
		{
			String opt_value = getOptionValue(src_cmd, opt_name);
			
			if(opt_value == null)
				return src_cmd;
			else
				return src_cmd.replace(opt_name + ":" + opt_value, "").trim();
		}
	}
	
	private Twitter twitter;
	
	/**
	 * コンストラクタ
	 * @param twitter
	 */
	public ProxySendProcesser(Twitter twitter)
	{
		this.twitter = twitter; 
	}
	
	@Override
	public boolean isTarget(DirectMessage dm) {
		
		String raw_msg = dm.getText().trim();
		if(raw_msg.startsWith("to:"))
			return true;
		else if(raw_msg.startsWith("cmd:send"))
			return true;
		else if(raw_msg.startsWith("type:"))
			return true;
		else if(raw_msg.startsWith("msg:"))
			return true;
		else
			return false;
	}
	
	@Override
	public void proc(DirectMessage dm) throws TwitterException, CommandParseException
	{
		try
		{
			String raw_msg = dm.getText().trim().replaceAll("cmd:send", "");
			raw_msg = raw_msg.trim();
			CommandOptionSplitter splitter = new CommandOptionSplitter();
			
			//送信タイプ(オプション)抽出
			String type = "r";
			type = splitter.getOptionValue(raw_msg, "type");
			raw_msg = splitter.getRemovedCommand(raw_msg, "type");
			
			//宛先(オプション)抽出
			String to = "";
			to = splitter.getOptionValue(raw_msg, "to");
			raw_msg = splitter.getRemovedCommand(raw_msg, "to");
			
			//メッセージ抽出
			//msg:以降の文字列を抽出
			String msg = raw_msg.substring(4);
	
			if(to == null)
			{
				twitter.updateStatus(msg);
			}
			else if(checkMutualFollow(dm.getSenderScreenName()) == true && checkMutualFollow(to) == true && msg.trim().length() > 0)
			{
				if(type == null || type.equals("r"))
					twitter.updateStatus("@" + to + " " + msg);
				else if(type.equals("d"))
					twitter.sendDirectMessage(to, msg);
				else
					System.out.println("invalid type.");				
			}
			else
			{
				throw new CommandParseException(dm, this);
			}
		}
		catch(Exception exc)
		{
			exc.printStackTrace();
			throw new CommandParseException(dm, this);
		}
	}
	
	/**
	 * ProxySednerと相互フォローの関係にあるか確認する
	 * @param screen_name
	 * @return
	 * @throws TwitterException
	 */
	private boolean checkMutualFollow(String screen_name) throws TwitterException
	{
		User me = twitter.getUserDetail(twitter.getUserId());
		
		if(twitter.existsFriendship(me.getScreenName(), screen_name) && 
				twitter.existsFriendship(screen_name, me.getScreenName())
		)
		{
			return true;
		}
		else
		{
			return false;
		}
	}

}
